#!/bin/bash
#Author:BiaoZyx
#Blog: http://cnblogs.com/BiaoZyx
#Time:2025-08-4 14:47:32
#Name:guess_number.sh
#Version：V1.0.1
#Description:This is a guess number game. 

# 清除屏幕保证欢迎ASCII字符正确显示
clear

# 欢迎界面
echo -e "\033[44;37;1m"
echo -e "  _|_|_|  _|    _|  _|_|_|_|    _|_|_|    _|_|_|                           "
echo -e "_|        _|    _|  _|        _|        _|                                 "
echo -e "_|  _|_|  _|    _|  _|_|_|      _|_|      _|_|                             "
echo -e "_|    _|  _|    _|  _|              _|        _|                           "
echo -e "  _|_|_|    _|_|    _|_|_|_|  _|_|_|    _|_|_|                             "
echo -e "                                                                           "
echo -e "_|      _|  _|    _|  _|      _|  _|_|_|    _|_|_|_|  _|_|_|               "
echo -e "_|_|    _|  _|    _|  _|_|  _|_|  _|    _|  _|        _|    _|             "
echo -e "_|  _|  _|  _|    _|  _|  _|  _|  _|_|_|    _|_|_|    _|_|_|               "
echo -e "_|    _|_|  _|    _|  _|      _|  _|    _|  _|        _|    _|             "
echo -e "_|      _|    _|_|    _|      _|  _|_|_|    _|_|_|_|  _|    _|             "
echo -e "                                                                           "
echo -e "                                  __          __                           "
echo -e "                                 (_ |_  _ || (_  _._o.__|_    _ .__o _ ._  "
echo -e "                                 __)| |(/_|| __)(_| ||_)|_ \\/(/_|_>|(_)| | "
echo -e "                                                     |                     "
echo -e "                     (GUESS NUMBER - Shell Script version 1.0.1 by BiaoZyx)"
echo -e "\033[0m"

# 设定基础变量
win=0           # 赢的次数
los=0           # 输的次数
min_num=1
# guess_count 和 win_stat 不再在这里初始化，而是在每局游戏开始时重置

# 帮助文档
help__() {
    echo -e "\033[1;4m
    --猜数字游戏帮助文档--
   [简介]
欢迎来到猜数字游戏！
这是一个简单的命令行游戏，你需要猜一个秘密数字。

   [玩法]
- 游戏开始时，程序会随机生成一个 1 到 100 之间的整数。
- 你需要输入你的猜测，建议使用“二分法”。
- 程序会告诉你猜的数字是太高、太低还是猜对了。
- 你需要根据提示继续猜测，直到猜对为止。
- 游戏会记录你猜的次数。\033[0m"
}

# 猜测判断函数（主函数）
main() {
    # 用户猜测
    read -p "请输入你的猜测（范围$numbers|次数$guess_count/7）：" input

    # 判断输入
    if ! [[ "$input" =~ ^[0-9]+$ ]]; then
        echo -e "\033[31m无效输入：请输入一个数字。\033[0m"
        return
    fi

    # 将正确输入转化为整数
    local true_input=$input

    # 验证范围
    if (( true_input < min_num || true_input > max_num )); then
        echo -e "\033[31m无效输入：数字必须在$min_num与$max_num之间。\033[0m"
        return
    fi

    # 如果有效，次数增加1
    ((guess_count++))
    # 紧接着判断
    if (( true_input == someone )); then # 推荐使用 (( == )) 进行数字相等比较
        echo -e "\033[32m游戏结束：恭喜你，猜对了！\033[0m" # 移除 \n，外层可以统一处理换行
        ((win++))
        win_stat=true
    elif (( true_input > someone )); then
        echo -e "\033[33m数字判断：大了。\033[0m"
        win_stat=false
    elif (( true_input < someone )); then
        echo -e "\033[33m数字判断：小了。\033[0m"
        win_stat=false
    fi

    # main 函数不处理游戏结束的直接跳出或失败信息
    # 这些逻辑将由外层的主循环来负责判断和执行
}

# 分数统计函数
score() {
    echo -e "\033[34m              "
    echo -e "  [分数统计]          "
    echo -e " --本局--             "
    echo -e "正确答案：$someone    "
    echo -e "使用次数：$guess_count"
    echo -e "结束状态：$win_stat   "
    echo -e "                      "
    echo -e " --全局--             "
    echo -e "胜利次数：$win        "
    echo -e "失败次数：$los        "
    echo -e "\033[0m               "
}

# 模式判定函数
mode_choose() {
    local mode_valid=false # 局部变量，用于判断模式是否选择有效
    while [ "$mode_valid" = false ]; do # 循环直到选择有效模式
        echo -e "\033[33m模式选择：\n\n1. 简单模式（1~50）\n2. 普通模式（1~100）\n3. 困难模式（1~200）\n(4)显示帮助\n\033[0m"
        read -p "请选择模式（1/2/3/4）：" mode

        case $mode in
            1)
                model_full_name="简单模式"
                numbers="1-50"
		        max_num=50
		        mode_valid=true
		    		;;
		    2)
		        model_full_name="普通模式"
                numbers="1-100"
                max_num=100
                mode_valid=true
                ;;
            3)
                model_full_name="困难模式"
                numbers="1-200"
                max_num=200
                mode_valid=true
                ;;
            4)
                help__
                # mode_valid 仍然是 false，会继续循环提示选择模式
                ;;
            *)
                echo -e "\033[31m请选择正确的选项！\033[0m"
                # mode_valid 仍然是 false，会继续循环提示选择模式
                ;;
        esac
    done
}

# 收尾
go_on_or_exit() {
    read -p "是否继续？（Y/n）：" exit_stat
    if [[ "$exit_stat" = "Y" || "$exit_stat" = "y" ]]; then
        return
    elif [[ "$exit_stat" = "N" || "$exit_stat" = "n" ]]; then
        echo "再见！"
        exit 0
    else
        echo -e "\033[31m无效输入：即将退出游戏。\033[0m"
        sleep 2
        exit 0
    fi
}

# 主循环
while true; do
    # 每一局游戏开始前，重置本局的计数和状态
    guess_count=0
    win_stat=false # 或者设置为 0，但要保持一致

    mode_choose # 确保模式被有效选择

    # 生成本局的秘密数字，此时 $numbers 已经根据模式选择被设置了
    someone=$(shuf -i "$numbers" -n 1) 

    echo -e "\033[32;4m我已经想好了一个 $model_full_name 模式下 ($numbers 范围) 的数字。"
    echo -e "你有 7 次机会来猜。\033[0m"
    
    # 本局游戏的核心猜测循环
    for i in $(seq 1 7); do
        main # 调用猜测函数，它会增加 guess_count 并设置 win_stat

        # 每次猜测后，判断本局游戏是否应该结束
        if [[ "$win_stat" = "true" ]]; then # 猜对了，提前结束本轮猜测
            break # 跳出 for 循环 (猜测回合)
        fi
        
        # 如果不是最后一次机会，并且还没猜对，继续提示
#        if (( guess_count < 7 && win_stat != true )); then
#            # 不需要额外输出，main函数已经处理了
#            : # bash特有，不做任何事情
        if (( guess_count == 7 && win_stat != true )); then # 猜测次数用尽，且没猜对
            echo -e "游戏结束：失败了，再接再厉！" # 移除 \n，外层可以统一处理
            ((los++)) # 失败次数增加
            break # 跳出 for 循环 (猜测回合)
        fi
    done

    # 游戏回合结束后，显示分数
    score
    
    # 询问是否继续
    go_on_or_exit
done
